//package com.wz.jiangsu.service.es.serviceImpl;
//
//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.core.lang.Validator;
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.PageUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.json.JSONUtil;
//import com.sl.ms.oms.api.OrderFeign;
//import com.sl.ms.oms.dto.OrderDTO;
//import com.sl.ms.search.domain.dto.CourierTaskDTO;
//import com.sl.ms.search.domain.dto.CourierTaskPageQueryDTO;
//import com.sl.ms.search.entity.CourierTaskEntity;
//import com.sl.ms.search.mapper.CourierTaskMapper;
//import com.sl.ms.search.service.CourierTaskService;
//import com.sl.ms.work.api.PickupDispatchTaskFeign;
//import com.sl.ms.work.api.TransportOrderFeign;
//import com.sl.ms.work.domain.dto.PickupDispatchTaskDTO;
//import com.sl.ms.work.domain.dto.TransportOrderDTO;
//import com.sl.ms.work.domain.dto.request.PickupDispatchTaskPageQueryDTO;
//import com.sl.ms.work.domain.enums.pickupDispatchtask.PickupDispatchTaskStatus;
//import com.sl.ms.work.domain.enums.pickupDispatchtask.PickupDispatchTaskType;
//import com.sl.transport.common.exception.SLException;
//import com.sl.transport.common.util.PageResponse;
//import lombok.extern.slf4j.Slf4j;
//import org.elasticsearch.action.search.SearchRequest;
//import org.elasticsearch.action.search.SearchResponse;
//import org.elasticsearch.client.RequestOptions;
//import org.elasticsearch.client.RestHighLevelClient;
//import org.elasticsearch.index.query.BoolQueryBuilder;
//import org.elasticsearch.index.query.QueryBuilders;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//import java.util.Optional;
//import java.util.stream.Collectors;
//
///**
// * @program: sl-express
// * @author: wz
// * @create: 2023-02-23 21:42
// * @description:
// **/
//@Service
//@Slf4j
//public class CourierTaskServiceImpl implements CourierTaskService {
//
//    @Value("${sl.init.isDelete}")
//    private Boolean isDelete;
//
//    @Resource
//    private CourierTaskMapper courierTaskMapper;
//
//    @Resource
//    private OrderFeign orderFeign;
//
//    @Resource
//    private PickupDispatchTaskFeign pickupDispatchTaskFeign;
//
//    @Resource
//    private TransportOrderFeign transportOrderFeign;
//
//    @Resource
//    private RestHighLevelClient client;
//
//
//    @Override
//    public PageResponse<CourierTaskDTO> pageQuery(CourierTaskPageQueryDTO pageQueryDTO) {
//        if (ObjectUtil.isEmpty(pageQueryDTO.getKeyword())) {
//            return new PageResponse<>();
//        }
//        SearchResponse response;
//        SearchRequest request = new SearchRequest("courier_task");
//        // 构建参数请求
//        this.getRequest(pageQueryDTO, request);
//        try {

//response = client.search(request, RequestOptions.DEFAULT);
//            System.out.println(Arrays.toString(response.getHits().getHits()));
//            //   log.info("response的数据 {}", response);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//        // 从ES库查询出来的总记录数 ---->>> 总记录数量
//        long total = response.getHits().getTotalHits().value;
//
//
//        int pages = PageUtil.totalPage((int) total, pageQueryDTO.getPgeSize());
//
//        // 查询出来 list 的集合去
////        List<CourierTaskDTO> courierTaskDtoList = Arrays.stream(response.getHits().getHits()).filter(ObjectUtil::isNotEmpty)
////                .map(SearchHit::getSourceAsString)
////                .map(jsonStr -> JSONUtil.toBean(jsonStr, CourierTaskDTO.class))
////                .collect(Collectors.toList());
////        for (SearchHit hit : response.getHits()) {
////            String s1 = hit.toString();
////            String s = JSONUtil.toJsonStr(s1);
////            JSONObject source = JSONUtil.parseObj(s);
////            JSONObject source1 = source.getJSONObject("_source");
////            CourierTaskDTO courierTaskDTO = JSONUtil.toBean(source1, CourierTaskDTO.class);
////
////        }
//        List<CourierTaskDTO> taskDTOList = Arrays.stream(response.getHits()
//                        .getHits())
//                .map(hit -> JSONUtil.toBean(hit.getSourceAsString(), CourierTaskDTO.class))
//                .collect(Collectors.toList());
//        // PageResponse<Object> pageResponse = PageResponse.of(courierTaskEntityList, pageQueryDTO.getPage(),pageQueryDTO.getPgeSize(),null, total);
//        // 封装对象
//        PageResponse<CourierTaskDTO> pageResponse = PageResponse.of(taskDTOList, pageQueryDTO.getPage(), pageQueryDTO.getPgeSize(), (long) pages, total);
//
//        return pageResponse;
//    }
//
//    @Override
//    public void saveOrUpdate(CourierTaskDTO courierTaskDTO) {
//        // 判断是不是为null
//        if (ObjectUtil.isEmpty(courierTaskDTO)) {
//            return;
//        }
//        CourierTaskEntity courierTaskEntity = BeanUtil.toBean(courierTaskDTO, CourierTaskEntity.class);
//        // 新增或者更新都可以
//        courierTaskMapper.save(courierTaskEntity);
//    }
//
//    @Override
//    public CourierTaskDTO findById(Long id) {
//        Optional<CourierTaskEntity> courierTaskEntity = courierTaskMapper.findById(id);
//        return BeanUtil.toBean(courierTaskEntity, CourierTaskDTO.class);
//    }
//
//    @Override
//    public List<CourierTaskDTO> findByOrderId(Long orderId) {
//        // 根据订单id查询出来数据
//        List<CourierTaskEntity> courierTaskEntitiesList = courierTaskMapper.findCourierTaskEntitiesByOrderId(orderId);
//        // 拷贝数据到 CourierTaskDTO
//
//
//        List<CourierTaskDTO> courierTaskDTOList = BeanUtil.copyToList(courierTaskEntitiesList, CourierTaskDTO.class);
//        return courierTaskDTOList;
//    }
//
//    /**
//     * 初始化同步数据到es
//     */
//    @Override
//    public void init() {
//        //开发、测试环境初始化es需要删除所有
//        if (isDelete) {
//            courierTaskMapper.deleteAll();
//        }
//
//        //查询全部取派件任务
//        PickupDispatchTaskPageQueryDTO pickupDispatchTaskPageQueryDTO = new PickupDispatchTaskPageQueryDTO();
//        pickupDispatchTaskPageQueryDTO.setPage(1);
//        pickupDispatchTaskPageQueryDTO.setPageSize(999);
//        PageResponse<PickupDispatchTaskDTO> pageResponse;
//        try {
//            pageResponse = pickupDispatchTaskFeign.findByPage(pickupDispatchTaskPageQueryDTO);
//        } catch (Exception e) {
//            throw new SLException("search微服务调用取派件feign分页查询失败", e);
//        }
//        List<PickupDispatchTaskDTO> items = pageResponse.getItems();
//
//        List<CourierTaskEntity> entities = new ArrayList<>();
//        for (PickupDispatchTaskDTO item : items) {
//            //封装快递员任务对象
//            CourierTaskEntity courierTaskEntity = this.getCourierTaskEntity(item);
//
//            //封装好的对象，添加到快递员任务列表
//            entities.add(courierTaskEntity);
//        }
//
//        //全部新增
//        courierTaskMapper.saveAll(entities);
//    }
//
//    /**
//     * 封装快递员任务对象
//     *
//     * @param pickupDispatchTaskDTO 取派件任务
//     * @return 快递员任务
//     */
//    public CourierTaskEntity getCourierTaskEntity(PickupDispatchTaskDTO pickupDispatchTaskDTO) {
//        //取派件任务字段复制到快递员任务
//        CourierTaskEntity courierTaskEntity = BeanUtil.toBean(pickupDispatchTaskDTO, CourierTaskEntity.class);
//        courierTaskEntity.setTaskType(pickupDispatchTaskDTO.getTaskType().getCode());
//        courierTaskEntity.setStatus(pickupDispatchTaskDTO.getStatus().getCode());
//        courierTaskEntity.setIsDeleted(pickupDispatchTaskDTO.getIsDeleted().getCode());
//
//        try {
//            //查询订单
//            OrderDTO orderDTO = orderFeign.findById(pickupDispatchTaskDTO.getOrderId());
//            //设置快递员任务的姓名、电话、地址字段
//            this.setNameAndPhoneAndAddress(pickupDispatchTaskDTO.getTaskType(), orderDTO, courierTaskEntity);
//        } catch (Exception e) {
//            log.error("id为{}的取派件任务的订单不存在！", pickupDispatchTaskDTO.getId());
//        }
//
//        //为快递员任务set运单号:取件任务新任务状态和已取消状态不查运单
//        if (ObjectUtil.equal(PickupDispatchTaskType.DISPATCH, pickupDispatchTaskDTO.getTaskType()) || ObjectUtil.equal(PickupDispatchTaskStatus.COMPLETED, pickupDispatchTaskDTO.getStatus())) {
//            TransportOrderDTO transportOrderDTO = transportOrderFeign.findByOrderId(pickupDispatchTaskDTO.getOrderId());
//            courierTaskEntity.setTransportOrderId(transportOrderDTO.getId());//运单id
//        }
//        return courierTaskEntity;
//    }
//
//    /**
//     * 设置快递员任务的姓名、电话、地址字段
//     *
//     * @param taskType          任务类型
//     * @param orderDTO          订单
//     * @param courierTaskEntity 快递员任务
//     */
//    private void setNameAndPhoneAndAddress(PickupDispatchTaskType taskType, OrderDTO orderDTO, CourierTaskEntity courierTaskEntity) {
//        String name;
//        String phone;
//        String address;
//        if (taskType.equals(PickupDispatchTaskType.PICKUP)) {
//            name = orderDTO.getSenderName();
//            phone = orderDTO.getSenderPhone();
//            address = orderDTO.getSenderAddress();
//        } else {
//            name = orderDTO.getReceiverName();
//            phone = orderDTO.getReceiverPhone();
//            address = orderDTO.getReceiverAddress();
//        }
//        courierTaskEntity.setAddress(address);
//        courierTaskEntity.setName(name);
//        courierTaskEntity.setPhone(phone);
//    }
//
//    // 构建查询条件的方法
//    private void getRequest(CourierTaskPageQueryDTO params, SearchRequest request) {
//        // 创建 bool 查询条件
//        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//        // 快递员状态任务过滤条件
//        if (ObjectUtil.isNotEmpty(params.getStatus())) {
//            boolQueryBuilder.filter(QueryBuilders.termQuery("status", params.getStatus()));
//        }
//        // 任务类型，1-取件，2-派件 任务类型过滤条件
//        if (ObjectUtil.isNotEmpty(params.getTaskType())) {
//            boolQueryBuilder.filter(QueryBuilders.termQuery("taskType", params.getTaskType()));
//        }
//        // 快递员id 和是否删除进行过滤
//        boolQueryBuilder.filter(QueryBuilders.termQuery("courierId",params.getCourierId()));
//        boolQueryBuilder.filter(QueryBuilders.termQuery("isDeleted",0));
//        // 通配符查询
//        String keyword = params.getKeyword(); // 关键词 查询
//        String keywordStr = StrUtil.format("*{}*", keyword); // 通配符关键词进行模糊查询
//        // 判断模糊查询或者是精确查询  根据校验规则
//        if (Validator.hasChinese(keyword)) { // 判断汉字是不是使用关键词查询，模糊查询
//            boolQueryBuilder.must(QueryBuilders.matchQuery("all", params.getKeyword()));
//        }else {
//            boolQueryBuilder.should(QueryBuilders.wildcardQuery("phone", keywordStr))
//                    .should(QueryBuilders.wildcardQuery("transportOrderId", keywordStr.toUpperCase()));
//        }
//
//
//
//        // 关键词需不需压到转换为运单或者是手机号进行精确查询
////        if (NumberUtil.isNumber(keyword)&& keyword.length() == 11 ) { // 是手机号的时候长度
////            boolQueryBuilder.must(QueryBuilders.termQuery("phone", Convert.toLong(keyword)));
////        }
////        if (StrUtil.startWith(keyword,"SL") && keyword.length() == 15) {  // 是运单号的时候长度
////            boolQueryBuilder.must(QueryBuilders.termQuery("transportOrderId",params.getKeyword()));
////        }
//        // 地址，姓名关键词查询
//
//        // 全部进行模糊查询
////        boolQueryBuilder.should(QueryBuilders.wildcardQuery("phone", keywordStr))
////                .should(QueryBuilders.wildcardQuery("transportOrderId", keywordStr))
////                .should(QueryBuilders.wildcardQuery("name", keywordStr))
////                .should(QueryBuilders.wildcardQuery("address", keywordStr));
//
//        request.source().query(boolQueryBuilder);
//        request.source().from((params.getPage() - 1) * params.getPgeSize()).size(params.getPgeSize());
//    }
//    private static final String CHINESE_REGEX = "\\w+[\u4E00-\u9FFF]+\\d+";
//
//    public static void main(String[] args) {
//        String str = "aanijhbb你好12334";
//        System.out.println(Validator.hasChinese(str));
//
////        String content = "你好1234";
////        boolean isMatch = ReUtil.contains(ReUtil.RE_CHINESES, content);
////        System.out.println(isMatch);
//    }
//
//
//}
